Graphs

Relationship between Educational Attainment and GDP per Capita

Relationship between Educational Attainment and GDP per Capita by Continent

Relationship between Educational Attainment and Child Mortality Rate by Continent

Relationship between Educational Attainment and Number of Workers in Family

Timeline Graph 1

primary_school %>%
  group_by(continent, year) %>%
  summarize(average = mean(primary_school)) %>%
  ggplot(aes(x=year,y=average, color=continent)) + 
  geom_point() + 
  geom_line() + 
  labs(x="Year", y="Average Rate of Educational Attainment", 
       title = "Educational Attainment over Time by Continent")

Map of World Educational Attainment

world <- primary_school %>%
  distinct(country)

map.world <- map_data("world")

world %>% 
  ggplot() +
  geom_map(data = map.world, map = map.world, 
           aes(map_id = region), fill = "white", color = "black") + 
  geom_map(aes(map_id = country), map = map.world) +
  expand_limits(x = map.world$long, y = map.world$lat) + # scale for fill
  theme_map() 






worldmap <- get_stamenmap(
    bbox = c(left = -180, bottom = -57, right = 179, top = 82.1), 
    maptype = "toner-background",
    zoom = 2
)

ggmap(worldmap)

primary_school %>%
  filter(decade == 1990) %>%
  group_by(decade, country) %>%
  summarize(average = mean(child_mortality)) %>%
  arrange(desc(average)) %>%
  filter(country==c("Niger", "Costa Rica")) 
longer object length is not a multiple of shorter object length

Tables

Mean Educational Attainment by Continent

primary_school <- primary_school %>%
  mutate(high_gdp = gdp_capita > 3955) 
# scatterplots to find interactions between variables
ggplot(primary_school, aes(x=gdp_capita, y=unemployment, color=high_gdp)) + geom_point()



# linear regression
library(broom)
tidy(lm(primary_school ~ high_gdp + unemployment, data=primary_school))

tidy(lm(primary_school ~ gdp_capita + unemployment + child_mortality, data=primary_school))

tidy(lm(primary_school ~ gdp_capita + unemployment + rural_pop, data=primary_school))

# an interaction effect will let one variable affect the other. Doesn't mean that the two variables are related
# coeff 0 -> no relationship
# less variables to fit b/c NA

country_list <- primary_school %>% 
  select(1:1) %>%
  distinct() 

save(country_list,file="country_list.Rda") 
  
## Map of World Educational Attainment
mapdata <- primary_school %>%
  arrange(desc(year)) %>%
  drop_na(gdp_capita) %>%
  group_by(country) %>%
  top_n(1, wt=year)


map.world <- map_data("world")

mapdata %>% 
  ggplot() +
  geom_map(data = map.world, map = map.world, 
           aes(map_id = region), fill = "white", color = "black") + 
  geom_map(aes(map_id = country), map = map.world) +
  geom_map(map = map.world, 
           aes(map_id = country, fill = high_gdp), color = "black") + 
  expand_limits(x = map.world$long, y = map.world$lat) + # scale for fill
  theme_map() 



worldmap <- get_stamenmap(
    bbox = c(left = -180, bottom = -57, right = 179, top = 82.1), 
    maptype = "toner-background",
    zoom = 2
)
ggmap(worldmap)



# chloropleth style by gdp or use high vs low gdp variables
# Pull most recent year for countries --> get rid of years with missing values, arrange_desc(year), 
# 5-6 plots are reasonable 
# Quality over quantity 
primary_school %>%
  ggplot(aes(x=year, y=primary_school, color=high_gdp)) + 
  geom_jitter() +
  facet_wrap(~ high_gdp) +
  geom_smooth(se=FALSE) + 
  labs(x="Year", y="Educational Attainment", title = "Comparison of Educational Attainment between countries with high and low GDP per capita")

primary_school %>%
  ggplot(aes(x=year, y=primary_school, color=high_gdp)) + 
  geom_jitter() +
  facet_wrap(~ continent) +
  geom_smooth(se=FALSE) + 
  labs(x="Year", y="Educational Attainment", title = "Comparison of Educational Attainment between countries with high and low GDP per capita")

Table

primary_school %>%
  group_by(continent) %>%
  summarize(mean_gdp = mean(gdp_capita)) %>%
  arrange(desc(mean_gdp))
plot <- ggplot(primary_school, aes(x=gdp_capita, y=primary_school, color=high_gdp)) + 
  geom_point() + 
  geom_smooth(method = "lm", se = FALSE) +
  labs(x="GDP per capita", y="Educational Attainment (Primary School)", 
       title="Educational Attainment and GDP per Capita by Continent")

ggplotly(plot)

NA

##Schooling Cost Graph

ggplot(primary_school,aes(x=schooling_cost,y=primary_school, color=high_gdp))+
  geom_point()+
  geom_smooth(method="lm", se=FALSE)

Gini Ratio

ggplot(primary_school,aes(x=gini,y=primary_school, color=high_gdp))+
  geom_point()+
  geom_smooth(method="lm", se=FALSE)

LS0tCnRpdGxlOiAiRGF0YSBTY2llbmNlIEZpbmFsIFByb2plY3QiCmF1dGhvcjogIkJsYWlyIENoYSwgS2FhcmluIEtoYW5kZWx3YWwsIER5bGFuIExhcnNlbiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobHVicmlkYXRlKQpsaWJyYXJ5KGNvdW50cnljb2RlKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkod2VzYW5kZXJzb24pCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdnbWFwKQpsaWJyYXJ5KGdndGhlbWVzKQpsaWJyYXJ5KGJyb29tKQoKcHJpbWFyeV9zY2hvb2wwIDwtIHJlYWRfZXhjZWwoInByaW1hcnlfc2Nob29sLnhsc3giKQp1cmJhbl9wb3ZlcnR5MCA8LSByZWFkX2V4Y2VsKCJ1cmJhbl9wb3ZlcnR5Lnhsc3giKQp1bmVtcGxveW1lbnQwIDwtIHJlYWRfZXhjZWwoInVuZW1wbG95bWVudC54bHN4IikKZ2RwX2NhcGl0YTAgPC0gcmVhZF9leGNlbCgiZ2RwX2NhcGl0YS54bHN4IikKY2hpbGRfbW9ydGFsaXR5MCA8LSByZWFkX2V4Y2VsKCJjaGlsZF9tb3J0YWxpdHkueGxzeCIpCmZhbWlseV93b3JrZXJzMCA8LSByZWFkX2V4Y2VsKCJmYW1pbHlfd29ya2Vycy54bHN4IikKcnVyYWxfcG9wMCA8LSByZWFkX2V4Y2VsKCJydXJhbF9wb3AueGxzeCIpCnNjaG9vbGluZ19jb3N0MCA8LSByZWFkX2V4Y2VsKCJzY2hvb2xpbmdfY29zdC54bHN4IikKZnJlZWRvbTAgPC0gcmVhZF9leGNlbCgiZnJlZWRvbS54bHN4IikKZ2luaTAgPC0gcmVhZF9leGNlbCgiZ2luaV9jb2VmZmljaWVudC54bHN4IikKZ2VuZGVyMCA8LSByZWFkX2V4Y2VsKCJnZW5kZXJfcmF0aW8ueGxzeCIpCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CiMgUmVhc3NlbWJsaW5nIGVhY2ggZGF0YXNldCB0byBsb25nZXIgc3R5bGUKCnByaW1hcnlfc2Nob29sIDwtIHByaW1hcnlfc2Nob29sMCAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb3VudHJ5LAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvPSJwcmltYXJ5X3NjaG9vbCIpICU+JQogIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSkKCgp1cmJhbl9wb3ZlcnR5IDwtIHVyYmFuX3BvdmVydHkwICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInllYXIiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG89InVyYmFuX3BvdmVydHkiKSAlPiUKICAgIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSkKCnVuZW1wbG95bWVudCA8LSB1bmVtcGxveW1lbnQwICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInllYXIiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG89InVuZW1wbG95bWVudCIpICU+JQogICAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpKQoKZ2RwX2NhcGl0YSA8LSBnZHBfY2FwaXRhMCAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb3VudHJ5LAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvPSJnZHBfY2FwaXRhIikgJT4lCiAgICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhcikpCgpjaGlsZF9tb3J0YWxpdHkgPC0gY2hpbGRfbW9ydGFsaXR5MCAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb3VudHJ5LAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvPSJjaGlsZF9tb3J0YWxpdHkiKSAlPiUKICAgIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSkKCmZhbWlseV93b3JrZXJzIDwtIGZhbWlseV93b3JrZXJzMCAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb3VudHJ5LAogICAgICAgICAgICAgICBuYW1lc190byA9ICJ5ZWFyIiwKICAgICAgICAgICAgICAgdmFsdWVzX3RvPSJmYW1pbHlfd29ya2VycyIpICU+JQogICAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpKQoKcnVyYWxfcG9wIDwtIHJ1cmFsX3BvcDAgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtY291bnRyeSwKICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAieWVhciIsCiAgICAgICAgICAgICAgIHZhbHVlc190bz0icnVyYWxfcG9wIikgJT4lCiAgICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhcikpCgoKc2Nob29saW5nX2Nvc3QgPC0gc2Nob29saW5nX2Nvc3QwICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInllYXIiLAogICAgICAgICAgICAgICB2YWx1ZXNfdG89InNjaG9vbGluZ19jb3N0IikgJT4lCiAgICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhcikpCgoKZnJlZWRvbSA8LSBmcmVlZG9tMCAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IC1jb3VudHJ5LAogICAgICAgICAgICAgIG5hbWVzX3RvID0gInllYXIiLAogICAgICAgICAgICAgIHZhbHVlc190bz0iZnJlZWRvbSIpICU+JQogIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSkKCgpnaW5pIDwtIGdpbmkwICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksCiAgICAgICAgICAgICAgbmFtZXNfdG8gPSAieWVhciIsCiAgICAgICAgICAgICAgdmFsdWVzX3RvPSJnaW5pIikgJT4lCiAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpKQoKCmdlbmRlciA8LSBnZW5kZXIwICU+JQogIHBpdm90X2xvbmdlcihjb2xzID0gLWNvdW50cnksCiAgICAgICAgICAgICAgbmFtZXNfdG8gPSAieWVhciIsCiAgICAgICAgICAgICAgdmFsdWVzX3RvPSJnZW5kZXJfcmF0aW8iKSAlPiUKICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhcikpCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CiMgSm9pbmluZyBldmVyeSBkYXRhc2V0IHRvIHByaW1hcnlfc2Nob29sCgpwcmltYXJ5X3NjaG9vbDEgPC0gcHJpbWFyeV9zY2hvb2wgJT4lCiAgaW5uZXJfam9pbih1cmJhbl9wb3ZlcnR5LCBieSA9IGMoInllYXIiLCJjb3VudHJ5IikpICU+JQogIGlubmVyX2pvaW4odW5lbXBsb3ltZW50LCBieSA9IGMoInllYXIiLCJjb3VudHJ5IikpICU+JQogIGlubmVyX2pvaW4oZ2RwX2NhcGl0YSwgYnkgPSBjKCJ5ZWFyIiwiY291bnRyeSIpKSAlPiUKICBpbm5lcl9qb2luKGNoaWxkX21vcnRhbGl0eSwgYnkgPSBjKCJ5ZWFyIiwiY291bnRyeSIpKSAlPiUKICBpbm5lcl9qb2luKGZhbWlseV93b3JrZXJzLCBieSA9IGMoInllYXIiLCJjb3VudHJ5IikpICU+JQogIGlubmVyX2pvaW4ocnVyYWxfcG9wLCBieSA9IGMoInllYXIiLCJjb3VudHJ5IikpICU+JQogIGlubmVyX2pvaW4oc2Nob29saW5nX2Nvc3QsIGJ5ID0gYygieWVhciIsImNvdW50cnkiKSkgJT4lCiAgaW5uZXJfam9pbihmcmVlZG9tLCBieSA9IGMoInllYXIiLCJjb3VudHJ5IikpICU+JQogIGlubmVyX2pvaW4oZ2luaSwgYnkgPSBjKCJ5ZWFyIiwiY291bnRyeSIpKSAlPiUKICBpbm5lcl9qb2luKGdlbmRlciwgYnkgPSBjKCJ5ZWFyIiwiY291bnRyeSIpKSAKYGBgCgpgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0KIyBBZGRpbmcgY29udGluZW50IHZhcmlhYmxlCgpuZXdkYXRhIDwtIGRhdGEuZnJhbWUoY291bnRyeT1wcmltYXJ5X3NjaG9vbCRjb3VudHJ5KQpuZXdkYXRhJGNvbnRpbmVudCA8LSBjb3VudHJ5Y29kZShzb3VyY2V2YXIgPSBwcmltYXJ5X3NjaG9vbCRjb3VudHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luPSAiY291bnRyeS5uYW1lIiwgZGVzdGluYXRpb249ICJjb250aW5lbnQiKQpuZXdkYXRhMSA8LSBuZXdkYXRhICU+JQogIHNlbGVjdChjb250aW5lbnQsIGNvdW50cnkpICU+JQogIGRpc3RpbmN0KCkKCnByaW1hcnlfc2Nob29sIDwtIHByaW1hcnlfc2Nob29sMSAlPiUKICBpbm5lcl9qb2luKG5ld2RhdGExLCBieT0iY291bnRyeSIpICU+JQogIG11dGF0ZShkZWNhZGUgPSBmbG9vcih5ZWFyLzEwKSoxMCkgJT4lCiAgZHJvcF9uYShwcmltYXJ5X3NjaG9vbCkgCgpWaWV3KHByaW1hcnlfc2Nob29sKQoKIyBTdWdnZXN0aW9uczogMSkgbWFrZSBzb21lIHZhcmlhYmxlcyBjYXRlZ29yaWNhbCAoY2F0ZWdvcnkgY2FuIGJlICJtaXNzaW5nIHZhbHVlIikgMikgZG9uJ3QgdXNlIHZhcmlhYmxlcyB3aXRoIHRvbyBtYW55IE5BcyAzKSBzZWxlY3QgcmFuZ2Ugb2YgeWVhcnMgNCkgZmluZCBvdGhlciBuZXcgdmFyaWFibGVzIApgYGAKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQpzYXZlKHByaW1hcnlfc2Nob29sLGZpbGU9InByaW1hcnlfc2Nob29sLlJkYSIpIAojbG9hZCBpdCB3aXRoIGxvYWQoInByaW1hcnlfc2Nob29sLlJkYSIpCmBgYAoKIyBHcmFwaHMKCiMjIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIEdEUCBwZXIgQ2FwaXRhCgojIyBSZWxhdGlvbnNoaXAgYmV0d2VlbiBFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBHRFAgcGVyIENhcGl0YSBieSBDb250aW5lbnQKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CnBsb3QxIDwtIGdncGxvdChwcmltYXJ5X3NjaG9vbCwgYWVzKHg9Z2RwX2NhcGl0YSwgeT1wcmltYXJ5X3NjaG9vbCwgY29sb3I9Y29udGluZW50KSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgbGFicyh4PSJHRFAgcGVyIGNhcGl0YSIsIHk9IkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFByaW1hcnkgU2Nob29sKSIsIAogICAgICAgdGl0bGU9IkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIEdEUCBwZXIgQ2FwaXRhIGJ5IENvbnRpbmVudCIpCgpnZ3Bsb3RseShwbG90MSkKYGBgCgojIyBSZWxhdGlvbnNoaXAgYmV0d2VlbiBFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBDaGlsZCBNb3J0YWxpdHkgUmF0ZSBieSBDb250aW5lbnQKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9CnBsb3QyIDwtIGdncGxvdChwcmltYXJ5X3NjaG9vbCwgYWVzKHg9Y2hpbGRfbW9ydGFsaXR5LCB5PXByaW1hcnlfc2Nob29sLCBjb2xvcj1jb250aW5lbnQpKSsKICBnZW9tX3BvaW50KCkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHdlc19wYWxldHRlKG49NSwgbmFtZT0iTW9vbnJpc2UzIikpICsKICBsYWJzKHg9IkNoaWxkIE1vcnRhbGl0eSBSYXRlIiwgeT0iRWR1Y2F0aW9uYWwgQXR0YWlubWVudCAoUHJpbWFyeSBTY2hvb2wpIiwgCiAgICAgICB0aXRsZT0iRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBhbmQgQ2hpbGQgTW9ydGFsaXR5IFJhdGUgYnkgQ29udGluZW50IikKCmdncGxvdGx5KHBsb3QyKQpgYGAKCiMjIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIE51bWJlciBvZiBXb3JrZXJzIGluIEZhbWlseQpgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0KcGxvdDMgPC0gZ2dwbG90KHByaW1hcnlfc2Nob29sLCBhZXMoeD1mYW1pbHlfd29ya2VycywgeT1zY2hvb2xpbmdfY29zdCwgY29sb3I9Z2RwX2NhcGl0YSkpICsgCiAgZ2VvbV9wb2ludChzaXplPTIsIGFscGhhPTAuNykgKyAKICBzY2FsZV9jb2xvcl9ncmFkaWVudChsb3cgPSAicmVkIiwgaGlnaD0iYmx1ZSIpICsKICBsYWJzKHg9Ik51bWJlciBvZiBXb3JrZXJzIGluIEZhbWlseSIsIHk9IkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgKFByaW1hcnkgU2Nob29sKSIsIAogICAgICAgdGl0bGU9IkVkdWNhdGlvbmFsIEF0dGFpbm1lbnQgYW5kIE51bWJlciBvZiBXb3JrZXJzIGluIEZhbWlseSIsIGNvbG9yPSJHRFAgcGVyIENhcGl0YSIpCgpnZ3Bsb3RseShwbG90MykKYGBgCgojIyBUaW1lbGluZSBHcmFwaCAxIApgYGB7cn0KcHJpbWFyeV9zY2hvb2wgJT4lCiAgZ3JvdXBfYnkoY29udGluZW50LCB5ZWFyKSAlPiUKICBzdW1tYXJpemUoYXZlcmFnZSA9IG1lYW4ocHJpbWFyeV9zY2hvb2wpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhcix5PWF2ZXJhZ2UsIGNvbG9yPWNvbnRpbmVudCkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9saW5lKCkgKyAKICBsYWJzKHg9IlllYXIiLCB5PSJBdmVyYWdlIFJhdGUgb2YgRWR1Y2F0aW9uYWwgQXR0YWlubWVudCIsIAogICAgICAgdGl0bGUgPSAiRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBvdmVyIFRpbWUgYnkgQ29udGluZW50IikKYGBgCgoKIyMgTWFwIG9mIFdvcmxkIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQKYGBge3J9CndvcmxkIDwtIHByaW1hcnlfc2Nob29sICU+JQogIGRpc3RpbmN0KGNvdW50cnkpCgptYXAud29ybGQgPC0gbWFwX2RhdGEoIndvcmxkIikKCndvcmxkICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9tYXAoZGF0YSA9IG1hcC53b3JsZCwgbWFwID0gbWFwLndvcmxkLCAKICAgICAgICAgICBhZXMobWFwX2lkID0gcmVnaW9uKSwgZmlsbCA9ICJ3aGl0ZSIsIGNvbG9yID0gImJsYWNrIikgKyAKICBnZW9tX21hcChhZXMobWFwX2lkID0gY291bnRyeSksIG1hcCA9IG1hcC53b3JsZCkgKwogIGV4cGFuZF9saW1pdHMoeCA9IG1hcC53b3JsZCRsb25nLCB5ID0gbWFwLndvcmxkJGxhdCkgKyAjIHNjYWxlIGZvciBmaWxsCiAgdGhlbWVfbWFwKCkgCgoKCgoKd29ybGRtYXAgPC0gZ2V0X3N0YW1lbm1hcCgKICAgIGJib3ggPSBjKGxlZnQgPSAtMTgwLCBib3R0b20gPSAtNTcsIHJpZ2h0ID0gMTc5LCB0b3AgPSA4Mi4xKSwgCiAgICBtYXB0eXBlID0gInRvbmVyLWJhY2tncm91bmQiLAogICAgem9vbSA9IDIKKQoKZ2dtYXAod29ybGRtYXApCmBgYAoKCgpgYGB7cn0KcHJpbWFyeV9zY2hvb2wgJT4lCiAgZmlsdGVyKGRlY2FkZSA9PSAxOTkwKSAlPiUKICBncm91cF9ieShkZWNhZGUsIGNvdW50cnkpICU+JQogIHN1bW1hcml6ZShhdmVyYWdlID0gbWVhbihjaGlsZF9tb3J0YWxpdHkpKSAlPiUKICBhcnJhbmdlKGRlc2MoYXZlcmFnZSkpICU+JQogIGZpbHRlcihjb3VudHJ5PT1jKCJOaWdlciIsICJDb3N0YSBSaWNhIikpIApgYGAKCgoKIyBUYWJsZXMKIyMgTWVhbiBFZHVjYXRpb25hbCBBdHRhaW5tZW50IGJ5IENvbnRpbmVudApgYGB7ciwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0KcHJpbWFyeV9zY2hvb2wgJT4lCiAgZ3JvdXBfYnkoY29udGluZW50KSAlPiUKICBzdW1tYXJpemUocHJpbWFyeV9zY2hvb2xfbWVhbiA9IG1lYW4ocHJpbWFyeV9zY2hvb2wpKSAlPiUKICBhcnJhbmdlKGRlc2MocHJpbWFyeV9zY2hvb2xfbWVhbikpCmBgYAoKYGBge3J9CnByaW1hcnlfc2Nob29sIDwtIHByaW1hcnlfc2Nob29sICU+JQogIG11dGF0ZShoaWdoX2dkcCA9IGdkcF9jYXBpdGEgPiAzOTU1KSAKYGBgCgpgYGB7cn0KIyBzY2F0dGVycGxvdHMgdG8gZmluZCBpbnRlcmFjdGlvbnMgYmV0d2VlbiB2YXJpYWJsZXMKZ2dwbG90KHByaW1hcnlfc2Nob29sLCBhZXMoeD1nZHBfY2FwaXRhLCB5PXVuZW1wbG95bWVudCwgY29sb3I9aGlnaF9nZHApKSArIGdlb21fcG9pbnQoKQoKCiMgbGluZWFyIHJlZ3Jlc3Npb24KbGlicmFyeShicm9vbSkKdGlkeShsbShwcmltYXJ5X3NjaG9vbCB+IGhpZ2hfZ2RwICsgdW5lbXBsb3ltZW50LCBkYXRhPXByaW1hcnlfc2Nob29sKSkKCnRpZHkobG0ocHJpbWFyeV9zY2hvb2wgfiBnZHBfY2FwaXRhICsgdW5lbXBsb3ltZW50ICsgY2hpbGRfbW9ydGFsaXR5LCBkYXRhPXByaW1hcnlfc2Nob29sKSkKCnRpZHkobG0ocHJpbWFyeV9zY2hvb2wgfiBnZHBfY2FwaXRhICsgdW5lbXBsb3ltZW50ICsgcnVyYWxfcG9wLCBkYXRhPXByaW1hcnlfc2Nob29sKSkKCiMgYW4gaW50ZXJhY3Rpb24gZWZmZWN0IHdpbGwgbGV0IG9uZSB2YXJpYWJsZSBhZmZlY3QgdGhlIG90aGVyLiBEb2Vzbid0IG1lYW4gdGhhdCB0aGUgdHdvIHZhcmlhYmxlcyBhcmUgcmVsYXRlZAojIGNvZWZmIDAgLT4gbm8gcmVsYXRpb25zaGlwCiMgbGVzcyB2YXJpYWJsZXMgdG8gZml0IGIvYyBOQQoKY291bnRyeV9saXN0IDwtIHByaW1hcnlfc2Nob29sICU+JSAKICBzZWxlY3QoMToxKSAlPiUKICBkaXN0aW5jdCgpIAoKc2F2ZShjb3VudHJ5X2xpc3QsZmlsZT0iY291bnRyeV9saXN0LlJkYSIpIAogIApgYGAKCgpgYGB7cn0KIyMgTWFwIG9mIFdvcmxkIEVkdWNhdGlvbmFsIEF0dGFpbm1lbnQKbWFwZGF0YSA8LSBwcmltYXJ5X3NjaG9vbCAlPiUKICBhcnJhbmdlKGRlc2MoeWVhcikpICU+JQogIGRyb3BfbmEoZ2RwX2NhcGl0YSkgJT4lCiAgZ3JvdXBfYnkoY291bnRyeSkgJT4lCiAgdG9wX24oMSwgd3Q9eWVhcikKCgptYXAud29ybGQgPC0gbWFwX2RhdGEoIndvcmxkIikKCm1hcGRhdGEgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX21hcChkYXRhID0gbWFwLndvcmxkLCBtYXAgPSBtYXAud29ybGQsIAogICAgICAgICAgIGFlcyhtYXBfaWQgPSByZWdpb24pLCBmaWxsID0gIndoaXRlIiwgY29sb3IgPSAiYmxhY2siKSArIAogIGdlb21fbWFwKGFlcyhtYXBfaWQgPSBjb3VudHJ5KSwgbWFwID0gbWFwLndvcmxkKSArCiAgZ2VvbV9tYXAobWFwID0gbWFwLndvcmxkLCAKICAgICAgICAgICBhZXMobWFwX2lkID0gY291bnRyeSwgZmlsbCA9IGhpZ2hfZ2RwKSwgY29sb3IgPSAiYmxhY2siKSArIAogIGV4cGFuZF9saW1pdHMoeCA9IG1hcC53b3JsZCRsb25nLCB5ID0gbWFwLndvcmxkJGxhdCkgKyAjIHNjYWxlIGZvciBmaWxsCiAgdGhlbWVfbWFwKCkgCgoKd29ybGRtYXAgPC0gZ2V0X3N0YW1lbm1hcCgKICAgIGJib3ggPSBjKGxlZnQgPSAtMTgwLCBib3R0b20gPSAtNTcsIHJpZ2h0ID0gMTc5LCB0b3AgPSA4Mi4xKSwgCiAgICBtYXB0eXBlID0gInRvbmVyLWJhY2tncm91bmQiLAogICAgem9vbSA9IDIKKQpnZ21hcCh3b3JsZG1hcCkKCgojIGNobG9yb3BsZXRoIHN0eWxlIGJ5IGdkcCBvciB1c2UgaGlnaCB2cyBsb3cgZ2RwIHZhcmlhYmxlcwojIFB1bGwgbW9zdCByZWNlbnQgeWVhciBmb3IgY291bnRyaWVzIC0tPiBnZXQgcmlkIG9mIHllYXJzIHdpdGggbWlzc2luZyB2YWx1ZXMsIGFycmFuZ2VfZGVzYyh5ZWFyKSwgCiMgNS02IHBsb3RzIGFyZSByZWFzb25hYmxlIAojIFF1YWxpdHkgb3ZlciBxdWFudGl0eSAKYGBgCgoKYGBge3J9CnByaW1hcnlfc2Nob29sICU+JQogIGdncGxvdChhZXMoeD15ZWFyLCB5PXByaW1hcnlfc2Nob29sLCBjb2xvcj1oaWdoX2dkcCkpICsgCiAgZ2VvbV9qaXR0ZXIoKSArCiAgZmFjZXRfd3JhcCh+IGhpZ2hfZ2RwKSArCiAgZ2VvbV9zbW9vdGgoc2U9RkFMU0UpICsgCiAgbGFicyh4PSJZZWFyIiwgeT0iRWR1Y2F0aW9uYWwgQXR0YWlubWVudCIsIHRpdGxlID0gIkNvbXBhcmlzb24gb2YgRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBiZXR3ZWVuIGNvdW50cmllcyB3aXRoIGhpZ2ggYW5kIGxvdyBHRFAgcGVyIGNhcGl0YSIpCmBgYApgYGB7cn0KcHJpbWFyeV9zY2hvb2wgJT4lCiAgZ2dwbG90KGFlcyh4PXllYXIsIHk9cHJpbWFyeV9zY2hvb2wsIGNvbG9yPWhpZ2hfZ2RwKSkgKyAKICBnZW9tX2ppdHRlcigpICsKICBmYWNldF93cmFwKH4gY29udGluZW50KSArCiAgZ2VvbV9zbW9vdGgoc2U9RkFMU0UpICsgCiAgbGFicyh4PSJZZWFyIiwgeT0iRWR1Y2F0aW9uYWwgQXR0YWlubWVudCIsIHRpdGxlID0gIkNvbXBhcmlzb24gb2YgRWR1Y2F0aW9uYWwgQXR0YWlubWVudCBiZXR3ZWVuIGNvdW50cmllcyB3aXRoIGhpZ2ggYW5kIGxvdyBHRFAgcGVyIGNhcGl0YSIpCmBgYAojIFRhYmxlCmBgYHtyfQpwcmltYXJ5X3NjaG9vbCAlPiUKICBncm91cF9ieShjb250aW5lbnQpICU+JQogIHN1bW1hcml6ZShtZWFuX2dkcCA9IG1lYW4oZ2RwX2NhcGl0YSkpICU+JQogIGFycmFuZ2UoZGVzYyhtZWFuX2dkcCkpCmBgYAoKYGBge3J9CnBsb3QgPC0gZ2dwbG90KHByaW1hcnlfc2Nob29sLCBhZXMoeD1nZHBfY2FwaXRhLCB5PXByaW1hcnlfc2Nob29sLCBjb2xvcj1oaWdoX2dkcCkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnMoeD0iR0RQIHBlciBjYXBpdGEiLCB5PSJFZHVjYXRpb25hbCBBdHRhaW5tZW50IChQcmltYXJ5IFNjaG9vbCkiLCAKICAgICAgIHRpdGxlPSJFZHVjYXRpb25hbCBBdHRhaW5tZW50IGFuZCBHRFAgcGVyIENhcGl0YSBieSBDb250aW5lbnQiKQoKZ2dwbG90bHkocGxvdCkKCmBgYAoKIyNTY2hvb2xpbmcgQ29zdCBHcmFwaAoKYGBge3J9CmdncGxvdChwcmltYXJ5X3NjaG9vbCxhZXMoeD1zY2hvb2xpbmdfY29zdCx5PXByaW1hcnlfc2Nob29sLCBjb2xvcj1oaWdoX2dkcCkpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgc2U9RkFMU0UpCmBgYAoKCiMjIEdpbmkgUmF0aW8KYGBge3J9CmdncGxvdChwcmltYXJ5X3NjaG9vbCxhZXMoeD1naW5pLHk9cHJpbWFyeV9zY2hvb2wsIGNvbG9yPWhpZ2hfZ2RwKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1GQUxTRSkKYGBgCgoK